/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package DAO;

import java.io.*;
import java.util.*;

/**
 *
 * @author victor
 */
public abstract class DAOGeneric implements IDAO {

    protected ObjectOutputStream out;
    protected ObjectInputStream in;
    Map<Integer, Object> dados;
    protected static Integer chave = 20;
    String arq;

    public DAOGeneric() {
    }

    public Map<Integer, Object> getDados() {
        return dados;
    }

    public DAOGeneric(String arq) {
        this.dados = new HashMap<Integer, Object>();
        this.arq = arq;
    }

    public void abrirLerArquivo() {
        try {
            this.in = new ObjectInputStream(new FileInputStream(this.arq));
        } catch (IOException ex) {
            ex.printStackTrace();
        }

    }

    public void abrirGravarArquivo() {
        try {
            this.out = new ObjectOutputStream(new FileOutputStream(this.arq));
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void fecharArquivoLido() {
        try {
            in.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public void fecharArquivoEscrito() {
        try {
            out.flush();
            out.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

    public boolean dadoExiste(Integer i) {
        if (dados.containsKey(i)) {
            return true;
        } else {
            return false;
        }
    }

    public void excluirDado(Object o) {
        dados.remove(o);
    }

    public void gravarDado(Object dado) {
        dados.put(++chave, dado);
    }

    public void persistirDados() {
        try {
            this.out.writeObject(this.dados);
        } catch (IOException ex) {
            ex.printStackTrace();
        }
        System.out.println("O arquivo " + arq + " foi gravado!");
    }

    public Object lerDadoPorIndice(Integer ind) {
        if (dados.containsKey(ind)) {
        return this.dados.get(ind);
         } else {
               return null;
         }
//
//        Collection c = dados.values();
//        Iterator ite = c.iterator();
//        while(ite.hasNext()){}

        
    }
    
    public Map lerDados() {
        try {
            this.dados = (Map<Integer, Object>) in.readObject();
            return dados;
        } catch (IOException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        return null;
    }

    public static Integer getChave() {
        return chave;
    }

    public static void setChave(Integer chave) {
        DAOGeneric.chave = chave;
    }
}
